package com.ymy.thinking.in.spring.bean.definition;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;
import thinking.in.spring.ioc.overview.domain.User;

import java.util.Map;

/**
 * 注解 {@link org.springframework.beans.factory.config.BeanDefinition} 示例
 *
 * @author Ringo
 * @date 2021/8/23 23:19
 */
// 3: 通过 @Import 来进行导入
// @Import 配合 @Configuration 一起使用, 将标记的类加入到 IoC 容器
//@Import(AnnotationRegistryBeanDefinitionDemo.Config.class)
//@Configuration
public class AnnotationRegistryBeanDefinitionDemo {

    public static void main(String[] args) {
        // 创建 IoC 容器
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();

        // 注册 Configuration Class（配置类）
        // 等同于在 Config 类上添加 @Configuration 注解
        // applicationContext.register(AnnotationBeanDefinitionDemo.class);

        // 这里使用包扫描
        applicationContext.scan("com.ymy.thinking.in.spring.bean.definition.**");

        // 启动 Spring 应用上下文
        applicationContext.refresh();

        // 依赖查找
        Map<String, Config> configBeans = applicationContext.getBeansOfType(Config.class);
        Map<String, User> userBeans = applicationContext.getBeansOfType(User.class);
        System.out.println("Config 类型所有的 Beans :" + configBeans);
        System.out.println("User 类型所有的 Beans :" + userBeans);

        // 显示关闭 Spring 应用上下文
        applicationContext.close();
    }


    // 2. 通过 @Component 方式定义 Bean
    // 使用了 @Import 方式, 就不使用 @Component 了（两种方式 任选其一）
    // @Configuration
    public static class Config {

        // 1: 通过 @Bean 的方式定义 Bean

        /**
         * 通过 Java 注解的方式, 定义了一个 Bean.
         * 配置 Bean 的别名.
         */
        @Bean(name = {"user", "ringo-user"})
        public User user() {
            User user = new User();
            user.setId(8848L);
            user.setName("李四");
            return user;
        }

    }
}
